package com.one.pass.service;

import com.one.pass.config.JacksonUtil;
import com.one.pass.config.TryRunModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.activemq.ScheduledMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
/*
ActiveMqService类用于处理ActiveMQ相关的操作，包括发送延迟消息和构建TryRunModel对象。
通过注入JmsMessagingTemplate和配置项的值，简化了消息发送的实现。
sendDelay方法用于发送带有延迟的消息到指定队列。
tryRunMq方法用于构建并发送TryRunModel对象到延迟队列，处理异常重试逻辑。
*/


@Service
@Slf4j
public class ActiveMqService {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Value("${spring.application.name}")
    private String applicationName;

    // 构建TryRunModel对象
    public static TryRunModel build(Object params, String paramsClas, String method, Object service, String name) {
        return new TryRunModel(JacksonUtil.obj2Json(params), paramsClas.getClass().getName(), method, service.getClass().getName(), name);
    }

    // 发送延迟消息到指定队列
    public void sendDelay(String queue, Object serializable, long time) {
        Map<String, Object> headers = new HashMap<>();
        headers.put(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);  // 设置延迟时间
        jmsMessagingTemplate.convertAndSend(queue, JacksonUtil.obj2Json(serializable), headers);  // 发送消息
        log.info("发送MQ的延迟队列 queue={},参数={}", queue, JacksonUtil.obj2Json(serializable));  // 记录日志
    }

    // 尝试运行MQ，发送TryRunModel对象到延迟队列
    public void tryRunMq(Object params, String method, Object service, String name) {
        TryRunModel tryRunModel = TryRunModel.build(params, params.getClass().getName(), method, service, name);
        sendDelay(applicationName + ".mq.try.run.send1", tryRunModel, 10 * 1000L);  // 发送延迟10秒的消息
    }
}
